package com.designpatterns.proxy.myproxy;

import com.designpatterns.proxy.Person;
import com.designpatterns.proxy.ZhangSan;

/**
 * 代理的特点（三个必要条件）：
 * 1.被代理者、代理者（两个角色）
 * 2.被代理者这件事必须要做，但是没精力去做、没时间去做、不想去做（怕羞）、不专业，找代理（注重过程）
 * 3.代理者要知道被代理者的需求（代理者持有被代理者的引用）
 *
 *
 * JDK动态代理原理：
 * 1.代理拿到被代理对象的引用，然后获取它的接口
 * 2.JDK的proxy重新生成一个新类，同事实现代理拿到的接口（被代理对象实现的接口）
 * 3.动态编译新类，动态load到jvm(class字节码)
 * 4.拿到新类的引用，然后执行方法
 * 总结：做了一件什么事情呢？  字节码重组
 *
 */
public class TestMyProxy {
    public static void main(String[] args) {
        MyMedium mymedium = new MyMedium();

        Person persion = (Person)mymedium.getInstance(new ZhangSan());

        persion.findHouse();


    }
}
